home *** CD-ROM | disk | FTP | other *** search
/ PD Collection CD 1 / PD Collection CD 1.iso / programer2 / pari2 / pari / other / plot_X < prev    next >
Text File  |  1991-11-28  |  8KB  |  244 lines

  1. /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
  2. /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
  3. /*                                                                 */
  4. /*                     PLOT EN HAUTE RESOLUTION                    */
  5. /*                                                                 */
  6. /*                       copyright Babe Cool                       */
  7. /*                                                                 */
  8. /*                                                                 */
  9. /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
  10. /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
  11.  
  12. # include "genpari.h"
  13.  
  14. #include <X11/Xlib.h>
  15. #include <X11/Xutil.h>
  16. #include <X11/Xos.h>
  17.  
  18. #define IDEC 90
  19. #define JDEC 5
  20.  
  21. void xerror()
  22. {
  23.   err(talker, "Problem with the X Window system");
  24. }
  25.  
  26. GEN  ploth(ep,a,b,ch)
  27.      entree *ep;
  28.      GEN a,b;
  29.      char *ch;   
  30. {
  31.   long av = avma,av2,jz,j,i,sig,is,js,iz;
  32.   GEN p1,p2,p3,p4,ysml,ybig,x,diff,dyj,dx,y[2000];
  33.   char c1[20], c2[20], c3[20], c4[20];
  34.   XPoint points[2000];
  35.  
  36.   Display *display;
  37.   Window win;
  38.   XSizeHints size_hints;
  39.   XEvent report;
  40.   GC gc;
  41.   XFontStruct *font_info;
  42.   int screen, width, height;
  43.   
  44.   sig=gcmp(b,a); if(!sig) return gnil;
  45.   if(sig<0) {x=a;a=b;b=x;}
  46.   
  47.   if (!(display = XOpenDisplay(NULL)))
  48.     err(talker, "no X server");
  49.   if (!(font_info = XLoadQueryFont(display, "9x15")))
  50.     err(talker, "cannot open 9x15 font");
  51.  
  52.   XSetErrorHandler(xerror);
  53.   XSetIOErrorHandler(xerror);
  54.  
  55.   screen = DefaultScreen(display);
  56.   width = DisplayWidth(display, screen) - 40;
  57.   height = DisplayHeight(display, screen) - 60;
  58.   is = width - IDEC - 5;
  59.   js = height - 25;
  60.   
  61.   for(i=0;i<=is;i++) y[i]=cgetr(3);
  62.   newvalue(ep,cgetr(3)); x=ep->value;
  63.   gaffect(a,x);
  64.   dx=gdivgs(gsub(b,a),is); ysml = ybig = gzero;
  65.   av2=avma;
  66.   for(i=0;i<=is;i++)
  67.     {
  68.       gaffect(lisexpr(ch), y[i]);
  69.       if(gcmp(y[i], ysml) < 0) ysml = y[i]; else if(gcmp(y[i], ybig) > 0) ybig = y[i];
  70.       gaddz(x,dx,x);avma=av2;
  71.     }
  72.   diff = gsub(ybig, ysml);
  73.   if(gcmp0(diff)) {ybig=gaddsg(1,ybig);diff=gun;}
  74.   dyj = gdivsg(js, diff); av2 = avma;
  75.   for(i = 0; i <= is; i++)
  76.     {
  77.       points[i].x = IDEC + i;
  78.       points[i].y = JDEC + itos(ground(gmul(gsub(ybig, y[i]),dyj)));
  79.       avma=av2;
  80.     }
  81.   jz = JDEC + itos(ground(gmul(ybig,dyj)));
  82.   if(gsigne(a)*gsigne(b)<0) iz = IDEC + itos(ground(gmulsg(is, gdiv(a, gsub(a, b)))));
  83.  
  84.   p1=cgetr(4); gaffect(ybig,p1); sprintf(c1,"%9.3lf",rtodbl(p1));
  85.   p2=cgetr(4); gaffect(ysml,p2); sprintf(c2,"%9.3lf",rtodbl(p2));
  86.   p3=cgetr(4); gaffect(a,p3); sprintf(c3,"%9.3lf",rtodbl(p3));
  87.   p4=cgetr(4); gaffect(b,p4); sprintf(c4,"%9.3lf",rtodbl(p4));
  88.  
  89.   win = XCreateSimpleWindow(display, RootWindow(display, screen), 0, 0, width, height, 4,
  90.                             BlackPixel(display, screen), WhitePixel(display, screen));
  91.  
  92.   size_hints.flags = PPosition | PSize;
  93.   size_hints.x = 0;
  94.   size_hints.y = 0;
  95.   size_hints.width = width;
  96.   size_hints.height = height;
  97.  
  98.   XSetStandardProperties(display, win, "ploth", NULL, NULL, NULL, 0, &size_hints);
  99.  
  100.   XSelectInput(display, win, ExposureMask | ButtonPressMask);
  101.  
  102.   gc = XCreateGC(display, win, 0, NULL);
  103.   XSetFont(display, gc, font_info->fid);
  104.   XSetForeground(display, gc, BlackPixel(display, screen)); 
  105.  
  106.   XMapWindow(display, win);
  107.  
  108.   for(;;)
  109.     {
  110.       XNextEvent(display, &report);
  111.       if (report.type != Expose) break;
  112.       while (XCheckTypedEvent(display, Expose, &report));
  113.       XDrawRectangle(display, win, gc, IDEC, JDEC, is, js);
  114.       XDrawLine(display, win, gc, IDEC, jz, IDEC + is, jz);
  115.       if (iz) XDrawLine(display, win, gc, iz, JDEC, iz, js + JDEC);
  116.       XDrawString(display, win, gc, 0, 15, c1, strlen(c1));
  117.       XDrawString(display, win, gc, 0, height - 30, c2, strlen(c2));
  118.       XDrawString(display, win, gc, IDEC - 20, height - 5, c3, strlen(c3));
  119.       XDrawString(display, win, gc, width - 90, height - 5, c4, strlen(c4));
  120.       XDrawLines(display, win, gc, points, is+1, 0);
  121.     }
  122.   XUnloadFont(display, font_info->fid);
  123.   XFreeGC(display, gc);
  124.   XCloseDisplay(display);
  125.   avma = av;
  126.   killvalue(ep);
  127.   return gnil;
  128. }
  129.  
  130. #define NBPOINTS 1500
  131.  
  132. GEN  ploth2(ep,a,b,ch)
  133.      entree *ep;
  134.      GEN a,b;
  135.      char *ch;   
  136. {
  137.   long av = avma,av2,jz,j,i,sig,is,js,iz;
  138.   GEN p1,p2,p3,p4,xsml,xbig,ysml,ybig,t,diffx,diffy,dy,dx,dt,x[NBPOINTS],y[NBPOINTS];
  139.   char c1[20], c2[20], c3[20], c4[20];
  140.   XPoint points[NBPOINTS];
  141.  
  142.   Display *display;
  143.   Window win;
  144.   XSizeHints size_hints;
  145.   XEvent report;
  146.   GC gc;
  147.   XFontStruct *font_info;
  148.   int screen, width, height;
  149.   
  150.   sig=gcmp(b,a); if(!sig) return gnil;
  151.   if(sig<0) {t=a;a=b;b=t;}
  152.   
  153.   if (!(display = XOpenDisplay(NULL)))
  154.     err(talker, "no X server");
  155.   if (!(font_info = XLoadQueryFont(display, "9x15")))
  156.     err(talker, "cannot open 9x15 font");
  157.  
  158.   XSetErrorHandler(xerror);
  159.   XSetIOErrorHandler(xerror);
  160.  
  161.   screen = DefaultScreen(display);
  162.   width = DisplayWidth(display, screen) - 40;
  163.   height = DisplayHeight(display, screen) - 60;
  164.   is = width - IDEC - 5;
  165.   js = height - 25;
  166.   
  167.   for(i=0;i<NBPOINTS;i++) {x[i] = cgetr(3); y[i]=cgetr(3);}
  168.   newvalue(ep,cgetr(3)); t=ep->value;
  169.   gaffect(a,t);
  170.   dt=gdivgs(gsub(b,a),NBPOINTS); xsml = xbig = ysml = ybig = gzero;
  171.   av2=avma;
  172.   for(i=0;i<NBPOINTS;i++)
  173.     {
  174.       p1 = lisexpr(ch);
  175.       gaffect(p1[1], x[i]); gaffect(p1[2], y[i]);
  176.       if(gcmp(x[i], xsml) < 0) xsml = x[i]; else if(gcmp(x[i], xbig) > 0) xbig = x[i];
  177.       if(gcmp(y[i], ysml) < 0) ysml = y[i]; else if(gcmp(y[i], ybig) > 0) ybig = y[i];
  178.       gaddz(t,dt,t);
  179.       avma=av2;
  180.     }
  181.   diffx = gsub(xbig, xsml);
  182.   if(gcmp0(diffx)) {xbig=gaddsg(1,xbig);diffx=gun;}
  183.   diffy = gsub(ybig, ysml);
  184.   if(gcmp0(diffy)) {ybig=gaddsg(1,ybig);diffy=gun;}
  185.   dy = gdivsg(js, diffy);
  186.   dx = gdivsg(is, diffx);
  187.   av2 = avma;
  188.   for(i = 0; i < NBPOINTS; i++)
  189.     {
  190.       points[i].x = IDEC + itos(ground(gmul(gsub(x[i],xsml),dx)));
  191.       points[i].y = JDEC + itos(ground(gmul(gsub(ybig, y[i]),dy)));
  192.       avma=av2;
  193.     }
  194.  
  195.   iz = IDEC - itos(ground(gmul(xsml, dx)));
  196.   jz = JDEC + itos(ground(gmul(ybig, dy)));
  197.  
  198.   p1=cgetr(4); gaffect(ybig,p1); sprintf(c1,"%9.3lf",rtodbl(p1));
  199.   p2=cgetr(4); gaffect(ysml,p2); sprintf(c2,"%9.3lf",rtodbl(p2));
  200.   p3=cgetr(4); gaffect(xsml,p3); sprintf(c3,"%9.3lf",rtodbl(p3));
  201.   p4=cgetr(4); gaffect(xbig,p4); sprintf(c4,"%9.3lf",rtodbl(p4));
  202.  
  203.   win = XCreateSimpleWindow(display, RootWindow(display, screen), 0, 0, width, height, 4,
  204.                             BlackPixel(display, screen), WhitePixel(display, screen));
  205.  
  206.   size_hints.flags = PPosition | PSize;
  207.   size_hints.x = 0;
  208.   size_hints.y = 0;
  209.   size_hints.width = width;
  210.   size_hints.height = height;
  211.  
  212.   XSetStandardProperties(display, win, "ploth", NULL, NULL, NULL, 0, &size_hints);
  213.  
  214.   XSelectInput(display, win, ExposureMask | ButtonPressMask);
  215.  
  216.   gc = XCreateGC(display, win, 0, NULL);
  217.   XSetFont(display, gc, font_info->fid);
  218.   XSetForeground(display, gc, BlackPixel(display, screen));
  219.  
  220.   XMapWindow(display, win);
  221.  
  222.   for(;;)
  223.     {
  224.       XNextEvent(display, &report);
  225.       if (report.type != Expose) break;
  226.       while (XCheckTypedEvent(display, Expose, &report));
  227.       XDrawRectangle(display, win, gc, IDEC, JDEC, width - IDEC - 5, js);
  228.       XDrawLine(display, win, gc, iz, JDEC, iz, js + JDEC);
  229.       XDrawLine(display, win, gc, IDEC, jz, width - 5, jz);
  230.       XDrawString(display, win, gc, 0, 15, c1, strlen(c1));
  231.       XDrawString(display, win, gc, 0, height - 30, c2, strlen(c2));
  232.       XDrawString(display, win, gc, IDEC - 20, height - 5, c3, strlen(c3));
  233.       XDrawString(display, win, gc, width - 90, height - 5, c4, strlen(c4));
  234.       XDrawLines(display, win, gc, points, NBPOINTS, 0);
  235.     }
  236.   XUnloadFont(display, font_info->fid);
  237.   XFreeGC(display, gc);
  238.   XCloseDisplay(display);
  239.   avma = av;
  240.   killvalue(ep);
  241.   return gnil;
  242. }
  243.  
  244.